package com.yvon.service.demo.spring.beans.factory.config;

import com.yvon.service.demo.spring.beans.BeansException;
import com.yvon.service.demo.spring.beans.PropertyValues;

/**
 * 作用于目标对象的实例化过程中需要处理的事情，包括实例化对象的前后过程以及实例的属性设置
 *
 * @author Yvon
 * @since 2023/1/10
 */
public interface InstantiationAwareBeanPostProcessor extends BeanPostProcessor{

    /**
     * 最先执行的方法，它在目标对象实例化之前调用，由于这个时候目标对象还未实例化，所以这个返回值可以用来代替原本该生成的目标对象的实例(比如代理对象)。
     *
     * @param beanClass bean类
     * @param beanName  bean名称
     * @return {@link Object}
     * @throws BeansException 异常
     */
    Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException;


    /**
     * 对属性值进行修改(这个时候属性值还未被设置，但是我们可以修改原本该设置进去的属性值)
     *
     * @param pvs      属性值
     * @param bean     bean
     * @param beanName bean名称
     * @return {@link PropertyValues}
     * @throws BeansException 异常
     */
    PropertyValues postProcessPropertyValues(PropertyValues pvs, Object bean, String beanName) throws BeansException;
}
